package com.zj.study.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/**
 * @author 赵赳
 * @since 2022/11/29 9:45
 */
public class FtpUtils {

  private final static String HOST = "10.173.0.107";
  private final static Integer PORT = 10021;
  private final static String USERNAME = "ftpuser2";
  private final static String PASSWORD = "Mcmc#1918";

  /**
   * 创建文件目录
   *
   * @param basePath 目录
   * @return 创建是否成功
   */
  public static boolean mkdir(String basePath) {
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(HOST, PORT);// 连接FTP服务器
      // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
      ftp.login(USERNAME, PASSWORD);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return false;
      }
      return ftp.makeDirectory(basePath);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ignored) {
        }
      }
    }
    return true;
  }


  /**
   * Description: 向FTP服务器上传文件
   *
   * @param basePath FTP服务器基础目录
   * @param filename 上传到FTP服务器上的文件名
   * @param input    输入流
   * @return 成功返回true，否则返回false
   */
  public static boolean uploadFile(String basePath, String filename,
      InputStream input) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(HOST, PORT);// 连接FTP服务器
      // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
      ftp.login(USERNAME, PASSWORD);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return false;
      }
      //设置上传文件的类型为二进制类型
      ftp.setFileType(FTP.BINARY_FILE_TYPE);
      // 转到文件目录
      ftp.changeWorkingDirectory(basePath);
      //上传文件
      if (!ftp.storeFile(filename, input)) {
        return result;
      }
      input.close();
      ftp.logout();
      result = true;
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ignored) {
        }
      }
    }
    return result;
  }

  /**
   * Description: 从FTP服务器下载文件
   *
   * @param remotePath FTP服务器上的相对路径
   * @param fileName   要下载的文件名
   * @param localPath  下载后保存到本地的路径
   * @return 是否成功
   */
  public static boolean downloadFile(String remotePath, String fileName, String localPath) {
    boolean result = false;
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(HOST, PORT);
      // 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
      ftp.login(USERNAME, PASSWORD);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return false;
      }
      ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
      FTPFile[] fs = ftp.listFiles();
      for (FTPFile ff : fs) {
        if (ff.getName().equals(fileName)) {
          File localFile = new File(localPath + "/" + ff.getName());

          OutputStream is = new FileOutputStream(localFile);
          ftp.retrieveFile(ff.getName(), is);
          is.close();
        }
      }
      ftp.logout();
      result = true;
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ioe) {
        }
      }
    }
    return result;
  }

  //ftp上传文件测试main函数
  public static void main(String[] args) {
    //上传
    try {
      FileInputStream in = new FileInputStream("D:\\test.txt");
      boolean flag = uploadFile("/text", "hello.txt", in);
      System.out.println(flag);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }

    ////下载
    //boolean b = downloadFile("/text/wenjian", "hello.txt", "D://");
    //System.out.println(b);
  }


}
